#include "processing.h"
#include "data_center.h"
#include "pkg.h"

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

xprocessing_t::xprocessing_t(std::shared_ptr<data_center_t> data_center_sptr)
    : data_center_sptr_(data_center_sptr)
{
}

//xprocessing_t::xprocessing_t(std::initializer_list<std::shared_ptr<xprocessing_t>> processor_list)
xprocessing_t::xprocessing_t(std::vector<std::shared_ptr<xprocessing_t>> list)
{
    processing_list_ = list;
}

xprocessing_t::~xprocessing_t()
{
}

void xprocessing_t::set_err_info(int64_t code, const std::string& msg)
{
    err_code_ = code;
    err_msg_ = msg;
}

std::pair<int, std::string> xprocessing_t::get_err_info()
{
    return std::make_pair(err_code_, err_msg_);
}

void xprocessing_t::add(std::shared_ptr<xprocessing_t> pp)
{
    processing_list_.emplace_back(pp);
}

void xprocessing_t::remove(std::shared_ptr<xprocessing_t> pp)
{
    for (auto it = processing_list_.begin(); it != processing_list_.end(); ++it) {
        if (*it == pp) {
            processing_list_.erase(it);
            break;
        }
    }
}

int xprocessing_t::handle_input(pkg& data)
{
    int ret = 0;
    err_code_ = 0;
    err_msg_.clear();
    for (auto proc : processing_list_) {
        ret = proc->handle_input(data);
        if (ret != 0) {
            std::tie(err_code_, err_msg_) = proc->get_err_info();
            break;
        }
    }
    return ret;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

pricing_client_check_t::pricing_client_check_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

pricing_client_check_t::~pricing_client_check_t()
{
}

int pricing_client_check_t::handle_input(pkg& data)
{
    printf("检查是否为报价方\t");
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    if (data_center_sptr_->x != 100) {
        set_err_info(301030604, "非合约报价方不能对合约进行报价");
        return -1;
    }

    return 0;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

client_id_corrected_t::client_id_corrected_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

client_id_corrected_t::~client_id_corrected_t()
{
}

int client_id_corrected_t::handle_input(pkg& data)
{
    printf("客户号修正\t");
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    // 根据结算账号对客户号进行修正

    return 0;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

member_id_corrected_t::member_id_corrected_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

member_id_corrected_t::~member_id_corrected_t()
{
}

int member_id_corrected_t::handle_input(pkg& data)
{
    printf("会员号修正\t");
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    // 根据结算账号对会员号进行修正

    // 交易会员自营，交易会员，客户交易会员 会员号不能为空
    return 0;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

contract_exist_check_t::contract_exist_check_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

contract_exist_check_t::~contract_exist_check_t()
{
}

int contract_exist_check_t::handle_input(pkg& data)
{
    printf("检查合约号是否存在\t");
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    if (data_center_sptr_->y != 200) {
        set_err_info(301030603, "合约不存在"); // 合约正在进行操作，获取失败！
        return -1;
    }

    return 0;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

contract_status_check_t::contract_status_check_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

contract_status_check_t::~contract_status_check_t()
{
}

int contract_status_check_t::handle_input(pkg& data)
{
    printf("检查合约号状态是否为已上市\t");
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    if (data_center_sptr_->y != 200) {
        set_err_info(301030605, "只能对状态为已上市对合约进行报价");
        return -1;
    }

    return 0;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

client_contract_inputed_check_t::client_contract_inputed_check_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

client_contract_inputed_check_t::~client_contract_inputed_check_t()
{
}

int client_contract_inputed_check_t::handle_input(pkg& data)
{
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    if (data_center_sptr_->z1 != 300) {
        set_err_info(301030606, "已经对合约提交协商报价申请，不能重复提交");
        return -1;
    }

    if (data_center_sptr_->z2 != 400) {
        set_err_info(301030608, "已经对合约提交挂牌报价申请，不能重复提交");
        return -1;
    }

    return 0;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
clear_account_no_check_t::clear_account_no_check_t(std::shared_ptr<data_center_t> data_center_sptr)
    : xprocessing_t(data_center_sptr)
{
}

clear_account_no_check_t::~clear_account_no_check_t()
{
}

int clear_account_no_check_t::handle_input(pkg& data)
{
    int ret = xprocessing_t::handle_input(data);
    if (ret != 0) {
        return ret;
    }

    return 0;
}
